<?php

namespace app\attachment\service;

use app\common\library\Service;
use fast\Random;
use JohnLui\AliyunOSS;

class Attachment extends Service
{
    use \app\common\library\traits\Model;

    protected $modelValidate = 'attachment/attachment';

    protected function _initialize()
    {
        parent::_initialize();
        $this->model = model($this->modelValidate);
    }

    /**
     * 附件上传接口
     * @param [array]  $file   [上传文件详情]
     * @param [string] $folder [上传子目录（模块）]
     * @return array
     */
    public function upload($file, $folder = 'common')
    {

        if (empty($file)) {
            $this->error = "请上传文件";
            return false;
        }

        //判断是否已经存在附件
        $sha1 = $file->hash();
        $uploaded = $this->model->where('sha1', $sha1)->find();
        if ($uploaded) return $uploaded;

        $upload = config('upload');
        preg_match('/(\d+)(\w+)/', $upload['maxsize'], $matches);
        $type = strtolower($matches[2]);
        $typeDict = ['b' => 0, 'k' => 1, 'kb' => 1, 'm' => 2, 'mb' => 2, 'gb' => 3, 'g' => 3];
        $size = (int)$upload['maxsize'] * pow(1024, isset($typeDict[$type])? $typeDict[$type] : 0);
        $fileInfo = $file->getInfo();
        $suffix = strtolower(pathinfo($fileInfo['name'], PATHINFO_EXTENSION));
        $suffix = $suffix? $suffix : 'file';
        $replaceArr = [
            '{year}'     => date("Y"),
            '{mon}'      => date("m"),
            '{day}'      => date("d"),
            '{hour}'     => date("H"),
            '{min}'      => date("i"),
            '{sec}'      => date("s"),
            '{folder}'   => $folder,
            '{random}'   => Random::alnum(16),
            '{random32}' => Random::alnum(32),
            '{filename}' => $suffix? substr($fileInfo['name'], 0, strripos($fileInfo['name'], '.')) : $fileInfo['name'],
            '{suffix}'   => $suffix,
            '{.suffix}'  => $suffix? '.' . $suffix : '',
            '{filemd5}'  => $sha1,
        ];
        $savekey = $upload['savekey'];
        $savekey = str_replace(array_keys($replaceArr), array_values($replaceArr), $savekey);
        $uploadDir = substr($savekey, 0, strripos($savekey, '/') + 1);

        //验证文件
        $splInfo = $file->validate(['size' => $size])->move(ROOT_PATH . '/public' . $uploadDir);
        if (!$splInfo) {
            $this->error = $file->getError();
            return false;
        }

        $imagewidth = $imageheight = 0;
        if (in_array($suffix, ['gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf'])) {
            $imgInfo = getimagesize($splInfo->getPathname());
            $imagewidth = isset($imgInfo[0])? $imgInfo[0] : $imagewidth;
            $imageheight = isset($imgInfo[1])? $imgInfo[1] : $imageheight;
        }

        $params = array(
            'filesize'    => $fileInfo['size'],
            'imagewidth'  => $imagewidth,
            'imageheight' => $imageheight,
            'imagename'   => substr($fileInfo['name'], 0, strripos($fileInfo['name'], '.')),
            'imagetype'   => $suffix,
            'imageframes' => 0,
            'mimetype'    => $fileInfo['type'],
            'path'        => $uploadDir . $splInfo->getSaveName() ,
            'url'         => config('upload.uploadurl') . $uploadDir . $splInfo->getSaveName(),
            'uploadtime'  => time(),
            'storage'     => 'local',
            'sha1'        => $sha1,
        );

        $result = $this->model->create(array_filter($params));
        if ($result === false) {
            $this->error = $this->model->getError();
            return false;
        }
        $params['id'] = $result->id;
        return $params;
    }
}
